package QianFeng07.IODemo2.NIO;

import java.nio.ByteBuffer;

/**
 * New IO （NIO）
 *
 * 1、为什么要使用NIO?
 * NIO是JDK1.4加入的新包，NIO 的创建目的是为了让Java程序员可以实现高速I/O而无需编写自定义的本机代码。
 * NIO将最耗时的1/O操作(即填充和提取缓冲区)转移回操作系统，因而可以极大地提高速度。
 *
 * 流与块的比较:
 * 原来的I/O库(在java.io.*中)与NIO最重要的区别是数据打包和传输的方式，
 *      原来的I/O以流的方式处理数据，而NIO以块的方式处理数据。
 * 面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据，一个输出流消费一个字节的数据。
 *      不利的一面是， 面向流的I/O通常相当慢。
 * 一个面向块的I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。 按块处理数据比
 *      按(流式的)字节处理数据要快得多。但是面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性。
 *
 * 缓冲区：
 * 在NIO库中，所有数据都是用缓冲区处理的。在读取数据时，它是直接读到缓冲区中的。在写入数据时，它是写
 *      入到缓冲区中的。任何时候访问NIO中的数据，您都是将它放到缓冲区中。
 * 缓冲区实质上是一个数组。通常它是一个字节数组， 但是也可以使用其他种类的数组。但是一个缓冲区不仅仅是
 *      一个数组。缓冲区提供了对数据的结构化访问，而且还可以跟踪系统的读/写进程。
 *
 * 缓冲区类型：
 * 最常用的缓冲区类型是ByteBuffer。一个ByteBuffer可以在其底层字节数组上进行get/set操作(即字节的获取和设置)。
 * ByteBuffer不是NIO中唯一的缓冲区类型。 事实上，对于每一种基本Java类型都有一种缓冲区类型:
 * ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer、DoubleBuffer
 **/
public class NIODemo {
    public static void main(String[] args) {
        //创建一个字节缓冲区，申请内存空间为8个字节
        ByteBuffer buf = ByteBuffer.allocate(8);
        System.out.println("position=" + buf.position());//起始位置  0
        System.out.println("limit=" + buf.limit());//限制  （默认与缓冲容量一样）  8
        System.out.println("capacity=" + buf.capacity());//缓冲容量   8

        //向缓冲区中写入数据
        System.out.println("---------------------写入数据后------------------");
        buf.put((byte) 10);
        buf.put((byte) 20);
        buf.put((byte) 30);
        buf.put((byte) 40);
        System.out.println("position=" + buf.position());//起始位置  4
        System.out.println("limit=" + buf.limit());//限制  8
        System.out.println("capacity=" + buf.capacity());//缓冲容量  8

        //缓冲区反转
        System.out.println("--------------------缓冲区反转-------------------");
        buf.flip();// limit = position  position = 0
        System.out.println("position=" + buf.position());//起始位置  0
        System.out.println("limit=" + buf.limit());//限制  4
        System.out.println("capacity=" + buf.capacity());//缓冲容量  8
        // hasRemaining() 告知当前位置和限制之间是否有元素
        if (buf.hasRemaining()) {
            for (int i = 0; i < buf.remaining(); i++) {//remaining()  缓冲区剩余元素个数  limit - position
                byte b = buf.get(i);
                System.out.println(b);
            }
        }

    }
}
